package com.clf.data.redis.core.json.ops;

import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.ValueOperations;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 * ops覆盖接口，用于动态代理
 * 
 * @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
 * @version
 * @since JDK 1.6 create on 2017年3月31日 Copyright 2017 ZZJR All Rights Reserved.
 *
 */
public interface FastJsonValueOperations<K, V> extends ValueOperations<K, V> {
	//@Deprecated
	//void set(K key, V value, DBExecutor<V> db);

	//@Deprecated
	//void set(K key, V value, DBExecutor<V> db, Long timeout, TimeUnit unit);

	//@Deprecated
	//V get(K key, DBExecutor<V> db);

	//@Deprecated
	//V get(K key, DBExecutor<V> db, Long timeout, TimeUnit unit);
	/**
	 * 获得指定类型的值
	 * @param type
	 * @return
	 */

	<T> T get(K key, Class<T> type);

	//@Deprecated
	//<T> T get(K key, Class<T> type, DBExecutor<T> db);

	//@Deprecated
	//<T> T get(K key, Class<T> type, DBExecutor<T> db, Long timeout, TimeUnit unit);
	/**
	 *  得到一个list类型的值
	 * @return
	 */
	List<V> getList(K key);

	//@Deprecated
	//List<V> getList(K key, DBExecutor<List<V>> db);

	//@Deprecated
	//List<V> getList(K key, DBExecutor<List<V>> db, Long timeout, TimeUnit unit);
	/**
	 * 得到一个list类型的值，list里面的元素类型为指定类型
	 * @param type
	 * @return
	 */
	<T> List<T> getList(K key, Class<T> type);

	//@Deprecated
	//<T> List<T> getList(K key, Class<T> type, DBExecutor<List<T>> db);

	//@Deprecated
	//<T> List<T> getList(K key, Class<T> type, DBExecutor<List<T>> db, Long timeout, TimeUnit unit);
	/**
	 * 设置值
	 */
	@Override
	void set(K key, V value);
	/**
	 * 设置值，并设置过期时间
	 */
	@Override
	void set(K key, V value, long timeout, TimeUnit unit);
	/**
	 * 设置值，如果当前值为空的话
	 */
	@Override
	Boolean setIfAbsent(K key, V value);
	/**
	 * 对多个key设置值
	 */
	@Override
	void multiSet(Map<? extends K, ? extends V> map);
	/**
	 * 对多个key设置值，如果对应的key没有值的话
	 */
	@Override
	Boolean multiSetIfAbsent(Map<? extends K, ? extends V> map);
	/**
	 * 获取值
	 */
	@Override
	V get(Object key);
	/**
	 * 获取值,同时设置一个新值
	 */
	@Override
	V getAndSet(K key, V value);
	/**
	 * 获得多个key的值
	 */
	@Override
	List<V> multiGet(Collection<K> keys);
	/**
	 * 自增
	 */
	@Override
	Long increment(K key, long delta);
	/**
	 * 自增
	 */
	@Override
	Double increment(K key, double delta);
	/**
	 * 追加字符串
	 */
	@Override
	Integer append(K key, String value);
	/**
	 * 获得字符串中的一部分
	 */
	@Override
	String get(K key, long start, long end);
	/**
	 * 指定的字符串覆盖给定 key 所储存的字符串值，覆盖的位置从偏移量 offset 开始。
	 */
	@Override
	void set(K key, V value, long offset);
	/**
	 *获得字符串长度
	 */
	@Override
	Long size(K key);
	/**
	 * 对 key 所储存的字符串值，设置或清除指定偏移量上的位(bit)。
	 */
	@Override
	Boolean setBit(K key, long offset, boolean value);
	/**
	 * 对 key 所储存的字符串值，获得指定偏移量上的位(bit)。
	 */
	@Override
	Boolean getBit(K key, long offset);

	@Override
	RedisOperations<K, V> getOperations();

}
